<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>02_显式原型和隐式原型</title>
</head>
<body>
<!--
1、每个函数function都有一个prototype，即显式原型
2、每个实例对象都有一个__proto__属性，可称为隐式原型
3、对象的隐式原型的值为其构造函数的显式原型的值
4、内存结构
5、总结：
    * 函数的prototype属性：在定义函数时自动添加的，默认值就是一个空Object对象
    * 对象的__proto__属性：创建对象时自动添加的，默认值为构造函数的prototype属性值
    * 程序员能直接操作显式原型，但不能直接操作隐式原型（在ES6之前）
-->
<script>
function Fn() { // 内部语句 this.prototype = {}

}

console.log(Fn.prototype)

var fn = new Fn(); // 内部语句 this.__proto__ = Fn.prototype
console.log(fn.__proto__);

console.log(Fn.prototype === fn.__proto__) // true

// 给原型添加方法
Fn.prototype.test = function() {
    console.log('test')
}

fn.test();
</script>
</body>
</html>